home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
130_01
/
gz0.asm
< prev
next >
Wrap
Assembly Source File
|
1985-03-09
|
7KB
|
228 lines
page 55
maclib bds
maclib cmac
maclib z80
direct
define cursor
define remcur
define mwa
define exycall
define hidecur
enddir
;
;********************************************************
;* *
;* BDS-C Supplementary Library *
;* release 2 *
;* *
;* Steve de Plater, Nov. 1980 *
;* 66 Priam St. *
;* Chester Hill, *
;* NSW, 2162 *
;* Australia *
;* Phone: (02) 644 4009 *
;* *
;* This file: GZ0.ASM release 1 *
;* *
;********************************************************
;
;********************************************************
;* *
;* THIS IS THE ONLY FILE WHICH IS SPECIFIC *
;* TO THE EXIDY SORCERER. *
;* IT IS ALSO THE ONLY FILE REQUIRING THE *
;* "Z80.LIB" MACRO LIBRARY. *
;* TO RECONFIGURE FOR YOUR OWN SYSTEM ALL THAT *
;* IS ESSENTIAL IS TO PROVIDE A "cursor(x,y)" *
;* FUNCTION WHICH CONFORMS TO THE FOLLOWING *
;* STANDARDS: *
;* (1) PLACES THE CURSOR AT POSITION (X,Y) *
;* ON THE VIDEO SCREEN (WHERE X IS THE *
;* ROW (DOWN) AND Y IS THE COLUMN (ACROSS))*
;* (2) IF (X,Y) IS NOT A VALID SCREEN POSITION *
;* (EG: -VE) THEN NO CURSOR MOVEMENT IS *
;* PERFORMED. *
;* (3) IN ALL CASES THE ADDRESS OF THE CURSOR *
;* (ON COMPLETION) IS RETURNED TO THE *
;* CALLING FUNCTION. *
;* *
;********************************************************
;
;============================================================
;
; int cursor(x,y);
;
; moves the cursor to position x (line), y (column) of
; the Sorcerer screen. (if possible)!
; Returns the offset from the beginning of the screen RAM
; of the new cursor position.
prelude cursor
call arghak ;get the arguements
push b ;we need it!
getiy equ 0e1a2h ;Exidy Monitor entry points
wcur equ 0e9cch ;write cursor
rec equ 0e9e8h ;remove the old one
ptrset equ 0e9d6h ;find the cursor address
lda arg2 ;get the column
ora a
reloc jm,curses ;you can't have a -ve column!
cpi 64
reloc jnc,curses ;or one > 63
lda arg1 ;get the line
ora a
reloc jm,curses ;you can't have a -ve line!
cpi 30
reloc jnc,curses ;or one > 29
lda arg1+1
ora a
reloc jnz,curses
lda arg2+1
ora a
reloc jnz,curses
call getiy
call rec
lda arg1
mov e,a ;and multiply it be 64
mvi d,0
mvi b,6
cur04: sla e
rl d
djnz cur04
stiy e,68h ;and save it in the MWA
stiy d,69h ;(both bytes)
lda arg2 ;now get the column
stiy a,6ah ;and save it too
stiyi 0,6bh ;high byte is zero
call wcur ;and put the cursor there!
curses: call ptrset ;just in case we hadn't
pop b ;told you we'd need it
ret ;home we go
postlude cursor ;generate relocation table
getiy equ 0e1a2h
pushix equ 0e5ddh
pushiy equ 0e5fdh
inxix equ 023ddh
scan equ 0e225h
;
;==============================================================
;
; int remcur()
;
; Removes the cursor from the screen.
; Returns the cursor address.
;
prelude remcur
push b
call getiy
call rec
pop b
ret
postlude remcur
;
;==============================================================
;
; int mwa();
;
; Returns the MWA address.
;
prelude mwa
call getiy
dw pushiy
pop h
ret
postlude mwa
;
;=============================================================
;
; int exycall();
;
; Calls the Exidy Standard Monitor
; using the monitor command found at MWA.
; Returns 0 if illegal command (or no command)
; or 1 if command successfully executed.
;
; WARNING: This function may not return AT ALL if you
; crash it in the Monitor itself! ;BE WARNED!
;
prelude exycall
push b ;just in case!
dw pushiy ;move IY
pop h ; to HL
call scan ;get delims
jr z,exyc5 ;NONE!
db 0ddh,021h,012h,0e3h
exyc1: push h
dw pushix
mvi b,2
exyc2: db 0ddh,07eh,00h
cmp m
jr nz,exyc4
inx h
dw inxix
djnz exyc2
pop d
pop d
reloc <lxi b,>,exyc6
push b
exyc3: db 0ddh,06eh,00h
db 0ddh,066h,01h
pchl
exyc4: db 0ddh,0e1h
pop h
dw inxix
dw inxix
dw inxix
dw inxix
db 0ddh,07eh,00h
ora a
jr nz,exyc1
exyc5: lxi h,0
pop b
ret
exyc6: lxi h,1
pop b
ret
postlude exycall
;
;=============================================================
;
; int hidecur(c)
; char c;
;
; Hides the character passed under the cursor (so that
; when the cursor is moved then "all secrets will be
; made known" (or at least displayed on the screen))!
;
; Returns the cursor address.
;
prelude hidecur
call arghak
push b
call getiy ;we may not have it
lda arg1 ;the char to hide
stiy a,067h ;and hide it there!
call ptrset ;get cursor address
pop b
ret ;and return
postlude hidecur
;get cursor address